package javase.ch03.tongxun.sync;

/**
 * 线程通信 本质上是等待唤醒机制
 * 线程通信 一定是在多线程并发访问的场景下才使用
 * 确保线程安全下，进行线程通信，否则会抛出IllegalMonitorStateException异常
 * 锁对象调用wait()等待，
 */
public class House {
    private int num = 0;
    //存储货物
    public void store(){
        synchronized (this){
        while (num>=1) {
            System.out.println("仓库已满,生产者需要进入等待");
            try {
                //等待
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }System.out.println(Thread.currentThread().getName() + "生产了" + (++num));
            //一旦生产，唤醒消费者线程
            this.notifyAll();
        }
    }
    //销售货物
    public void sale(){
        synchronized (this){
        while(num<=0){
            System.out.println("仓库已空,消费者需要进入等待");
            try {
                //等待
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        } System.out.println(Thread.currentThread().getName() + "消费了" + (num--));
            //一旦消费，唤醒生产者线程
            this.notifyAll();
        }
    }
}
